#ifndef COM_FUN_H
#define COM_FUN_H

#include "main.h"

typedef struct 
{
	vu8 *q_data; //数据指针
	vu32 buflen; //缓冲区长度
	vu32 r; //队首(r)指向还没读的那个字节
	vu32 w;//队尾(w)指向即将写的那个字节
	vu32 dlen;//数据的长度

	vu8 *p_in; //输入的数据指针(为了节省堆栈)
	vu32 n_in; //输入的数据长度
	vu32 empty; //空的长度，每次计算时更新
} Queue;
void Queue_ini(u8 *p,u32 num,Queue *q);

//为了提高效率，编写单字节操作函数
int Queue_set_1(u8 p,Queue *q);	//队成功返回0，失败返回1
int Queue_get_1(u8 *p,Queue *q); //出队成功返回0，失败返回非零

int get_que_data(u8 *p,Queue *q);
//////////////////////////////////////////////////////////////////////////
//				索引队列，用于不确定数据结构外置缓存，仅提供索引
//////////////////////////////////////////////////////////////////////////
typedef struct 
{
	vu32 buflen; //缓冲区长度
	vu32 r; //队首(r)指向还没读的那个字节
	vu32 w;//队尾(w)指向即将写的那个字节
	vu32 dlen;//数据的长度
} IndQueue; //索引队列，仅提供索引，缓存外置
void IndQueue_ini(u32 buflen,IndQueue *q); //初始化
int IndQueue_push(IndQueue *q); //写指针向前移动,返回0成功
int IndQueue_pop(IndQueue *q); //读指针向前移动,返回0成功

//////////////////////////////////////////////////////////////////////////
//				校验部分
//////////////////////////////////////////////////////////////////////////
u32 cal_crc32(u8 *p,u32 n);
u8 check_sum(u8 *p,u32 n);

#endif

